#ifndef __DIGIMON_H__
#define __DIGIMON_H__
#include "user_extern.h"
#include "digimon_libs.h"

typedef void digimon_t;

struct digimon_api{
    int (*init_digimon_bmp)(uint16_t digiId, unsigned char *bmps[48][6]);
    void (*display)(uint8_t m_tiki);  /* 在屏幕上描绘一只digimon */
};

#define DIGI_NAMELEN 10
#define DIGIMON_Y    6
/****************************************
 *  数码宝贝信息结构体
 ****************************************/
struct digimon_st
{
    uint16_t      digi_id;                      /* id */
    char          digi_name[DIGI_NAMELEN];      /* name */
    uint8_t       digi_level;                   /* 宠物等级 */
    uint16_t      digi_status;                  /* 状态 */
    uint8_t       digi_age;                     /* age */
    int8_t        digi_weight;                  /* 体重 */
    int8_t        digi_hungry;                  /* 饥饿度 */
    uint8_t       digi_strength;                /* 力气 */
    int8_t        digi_dp;                      /* dp */ 
    uint8_t       digi_maxdp;                   /* 最大DP */
    uint8_t       digi_type:4;                  /* 类型 */
    uint8_t       digi_enableB:2;               /* 战斗许可 */
    uint8_t       digi_enableJ:2;               /* 合体许可 */
    int           digi_evolution;               /* 进度条 */
    int           digi_max_evolution;           /* 进度条最大值 */
    uint16_t      digi_currency;                /* 货币 */
    uint8_t       digi_light;                   /* 灯 */
    uint8_t       digi_misscall;                /* misscall */
    uint32_t      digi_time;                    /* 宠物生存计数 */
    uint8_t       digi_dabian;                  /* 大便的数量 */
    uint8_t       digi_health;                  /* 宠物的健康度 */

    uint16_t      digi_battle;                  /* 对战场数 */
    uint8_t       digi_win;                     /* 胜利场数 */
    uint8_t       digi_attck;                   /* 战斗力 */
    uint8_t       digi_defence;                 /* 防御力 */
    uint8_t       digi_miss;                    /* 闪避率 */

    const char    (*bmp)[48][6];                /* 贴图 */
    const char    (*skill_bmp)[4];              /* 技能贴图 */

    //struct digimon_api api;
    int  (*init_digimon_bmp)(uint16_t digiId, unsigned char *bmps[48][6]);
    void (*display)(uint8_t m_tiki);        /* 在屏幕上描绘一只digimon */
    void (*show_sys_menu)(uint8_t index);   /* 绘制系统图标 */
    void (*show_sys_aixin)(uint8_t current);/* 绘制爱心 */
    void (*show_shirt)(uint8_t m_tiki);     /* 绘制大便 */
    void (*show_ill)(void);  
    void (*show_no)(void);               /* 绘制生病 */
    uint8_t (*digimon_eat)(struct digimon_st *digimon, uint8_t food);

    void (*system_digimon_info)(uint8_t page);
};
extern struct digimon_st digimon;



/****************************************
 *  食物
 * **************************************/
enum food{
    FOOD_DRUMSTICKS = 0,    /* 鸡腿 */
    FOOD_POTION,            /* DP药 */
};

enum food2{
    FOOD_MEDICINE = 0,          /* 生病 */
    FOOD_HURT_MED,          /* 受伤 */
};
/****************************************
 *  训练
 * **************************************/
enum trining{
    TRI_CLASSIC = 0,            /* 普通训练 */
    TRI_PENDULUM,               /* 摇机训练 */
    TRI_SEARCH,                 /* 搜索训练 */
    TRI_CLASSIC_MOVIE,          /* 普通训练动画 */
    TRI_PENDULUM_MOVIE,         /* 摇机训练动画 */
    TRI_SEARCH_MOVIE,           /* 搜索训练动画 */
};

/****************************************
 *  战斗
 * **************************************/
enum battle{
    BATTLE = 0,             /* 战斗允许 */
    JOCRES                  /* 合体允许 */
};

/****************************************
 *  清洁和休息
 * **************************************/
#define ON  1
#define OFF 0
enum other{
    OTH_TOILET = 1,             /* 马桶 */
    OTH_BRICHT                  /* 休息 */
};

/****************************************
 *  数码宝贝类型
 * **************************************/
enum digit_type{
    TYPE_FR,                /* 未知 */
    TYPE_NSp,               /* 自然灵魂 */
    TYPE_DS,                /* 深海救星 */
    TYPE_NSo,               /* 噩梦军团 */
    TYPE_WG,                /* 风之守卫 */
    TYPE_ME,                /* 钢铁帝国 */
    TYPE_VB,                /* 病毒克星 */
    TYPE_DR,                /* 龙之咆哮 */
    TYPE_JT,                /* 丛林奇兵 */
    TYPE_DA,                /* 黑暗区域 */
    TYPE_UK                 /* 无法解析 */
};

/****************************************
 *  数码宝贝状态
 * **************************************/
enum digi_sta{
    STA_NORMAL = 0,         /* 正常 */
    STA_ILL,                /* 生病 */
    STA_HURT,               /* 受伤 */
    STA_SHIRT,              /* 拉屎 */
    STA_SLEEP,              /* 睡觉 */
    STA_HUNGRY,             /* 饥饿 */
    STA_FULL_HUNGRY,        /* 饱腹 */
    STA_FULL_DP,            /* 满DP */
    STA_FULL_POWER,         /* 满力量 */
    STA_FULL_EVLUTION,      /* 满经验 */
};

/****************************************
 *  数码宝贝等级
 * **************************************/
enum digi_level{
    DIGI_EGG,               /* 蛋 */
    DIGI_YOUZHIQI,          /* 幼稚期 */
    DIGI_YOUNIANQI,         /* 幼年期 滚球兽 */
    DIGI_CHENGZHANGQI,      /* 成长期 亚古兽 */
    DIGI_CHENGSHUQI,        /* 成熟期 暴龙兽 */
    DIGI_WANQUANTI,         /* 完全体 机械暴龙兽 */
    DIGI_JIUJITI,           /* 究级体 战斗暴龙兽 */
    DIGI_CHAOJIUJITI,       /* 超究级体 */
};
#define EGG_TIME             (1*10)
#define YOUZHIQI_TIME        (10*60)
#define YOUNIANQI_TIME       (12*60*60)
#define CHENGZHANGQI_TIME    (24*60*60)
#define CHENGSHUQI_TIME      (40*60*60)
#define WANQUANTI_TIME       (48*60*60)
#define JIUJITI_TIME         (50*60*60)

#define DIGIMON_TRAIN_SELECT    " SELECT "
#define DIGIMON_TRAIN_CLASSIC   "Classic"
#define DIGIMON_TRAIN_PENDULUM  "Pendulum"
#define DIGIMON_TRAIN_SEARCH    "Search"

digimon_t *digimon_init(uint8_t digiType);
void digimon_display(uint8_t m_tiki);
void digimon_dis_menu(uint8_t index);
void digimon_dis_aixin(uint8_t current);
void digimon_dis_shirt(uint8_t m_tiki);
void digimon_dis_ill(void);
void digimon_say_no(void);
uint8_t digimon_eat(struct digimon_st *digimon, uint8_t food);

void system_digimon_info(uint8_t page);
void system_digimon_eat_select(uint8_t food);
int system_digimon_eat_act(int food);
void system_digimon_training_select(int training_type);
int system_digimon_training_act(uint8_t tri_type, uint8_t power);
void system_digimon_training_classic_movic(uint8_t power);
void system_digimon_battle_select(uint8_t type);
int system_digimon_clean(void);
int system_digimon_ligth_select(uint8_t onoff);
int system_get_digimon_by_id(uint16_t id, unsigned char *bmps[48][6]);
int system_digimon_dataBase(unsigned char *bmps[48][6]);
#endif